"""
上下文
    上下文：是一个 数据容器，保存了 Flask 程序运行过程中的一些信息。
    Flask中有两种上下文，请求上下文 和 应用上下文
    两种上下文的使用范围相同, 从请求开始到请求结束, 在范围外使用会报错

1.请求上下文
    记录一些和请求有关的数据, 包括request和session两个变量
    request
        封装了HTTP请求的内容，针对的是http请求。
    session
        用来记录请求会话中的信息，针对的是用户信息

2.应用上下文
    记录一些和应用有关的数据, 包括current_app和g两个变量
    current_app
        会自动引用创建的Flask对象, 需要在项目的其他文件中使用Flask对象(app=Flask(__name__))时, 应该通过current_app来获取, 可以减少循环导入问题
    g
        flask给开发者预留的一个容器, 用于记录自定义数据
        g变量每次请求会重置数据
        g使用场景: 1> 在钩子函数和视图函数之间传递数据 2> 函数嵌套调用时传递数据

上下文变量是否为全局变量?
    不是全局变量, web服务器会通过多线程并发调用web应用, 而全局变量会被所有线程共享, 无法记录并发的多个请求数据

    上下文机制实现了线程隔离(LocalStack类型, 本质是字典, key是线程id, 值是上下文变量), 每个线程存取自己的数据, 相互不影响

    请求1 -> 线程1 -> request = 请求1
    请求2 -> 线程2 -> request = 请求2

上下文为什么设置使用范围?
    主要目的为节省内存
    请求开始时, 创建上下文(记录上下文变量);
    请求结束时, 销毁上下文(将上下文变量删除, 数据占用的空间被释放)
"""
from tool import func1
from flask import Flask, request, g

# 上下文变量: 有使用范围  [请求开始, 请求结束]
# 请求上下文: 记录一些和请求有关的数据 request session
# 应用上下文: 记录一些和应用有关的数据  current_app  g


app = Flask(__name__)


@app.route('/')
def index():
    # print(request.url)

    # 使用g变量记录数据
    g.name = 'zhangsan'
    # 嵌套调用时传递数据
    func1()
    return "index"


# @app.route('/username')
# def username():
#     # 再视图函数与视图函数间传递数据 会报错
#     print(g.name)
#     return "username"


@app.after_request
def after(res):
    print("钩子函数和视图函数之间传递数据:{}".format(g.name))
    return res


if __name__ == '__main__':
    # print(request.url)  # 超出使用范围, 会报错
    # print(g)  # 超出范围, 会报错
    app.run(debug=True)
